package com.xunshibao.service.info;

import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.xunshibao.core.dao.page.Pagination;
import com.xunshibao.dao.info.TutorDaoImpl;
import com.xunshibao.entity.info.TutorInfo;
import com.xunshibao.util.DateUtil;
import com.xunshibao.util.ReflectionUtil;

public class TutorServiceImpl {
	private static final Logger log = LoggerFactory.getLogger(TutorServiceImpl.class);
	private TutorDaoImpl dao;

	public void setDao(TutorDaoImpl dao) {
		this.dao = dao;
	}

	public int postTutorInfo(TutorInfo info, Long userId, String ipaddress) {
		if (info != null) {
			if (info.getSubject() != null && 0 != info.getSubject()) {
				Date now = new Date();
				info.setPoster(userId);
				info.setPostDate(DateUtil.date2Int(now));
				info.setIpaddress(ipaddress);
				info.setStatus(TutorInfo.Status.START.value());
				// 有效期没有指定
				if (info.getAvialableDate() == null && 0 != info.getAvialableDate()) {
					info.setAvialableDate(DateUtil.addDate(now, Calendar.DAY_OF_MONTH, 1));
				}
				// 保存信息
				boolean result = this.dao.save(info);
				if (!result) {
					return -3;// 保存数据库失败
				}
			} else {
				return -2;// 必须为该信息指定一个课程
			}
		} else {
			return -1;// 信息为空
		}

		return 0; // 成功
	}

	public int updateTutorInfo(TutorInfo info, Long userId, String ipaddress) {
		if (info != null) {
			if (!info.getPoster().equals(userId)) {
				return -2;// 只能编辑自己的信息
			} else {
				Long id = info.getId();
				if (id != null) {
					TutorInfo dbInfo = this.dao.getById(id);
					if (dbInfo != null) {
						int result = ReflectionUtil.copyChangeValue(info, dbInfo,
								Arrays.asList("id", "poster", "postDate", "status", "title", "ipaddress"));
						if (result != 0) {
							dbInfo.setIpaddress(ipaddress);
							this.dao.update(dbInfo);
						}
					} else {// 要更新的数据不存在
						return -3;// 要更新的数据不存在
					}

				} else {
					return -4;// 更新数据ID为空
				}
			}
		} else {
			return -1;// 信息为空
		}
		return 0; // 成功
	}

	public TutorInfo getTutorInfo(Long id) {
		return dao.getById(id);
	}

	/**
	 * 列出我发布的信息
	 * 
	 * @param userId
	 * @param status
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public Pagination listMyTutorInfo(Long userId, TutorInfo.Status status, int pageNo, int pageSize) {
		if (status == null) {
			return dao.getByUserId(userId, pageNo, pageSize);
		} else {
			return dao.getByUserIdAndStatus(userId, status, pageNo, pageSize);
		}
	}

	/**
	 * 按照课程类型列出信息
	 * 
	 * @param subject
	 *            1：语文，2：小学数学
	 * @param status
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public Pagination listBySubject(Integer subject, TutorInfo.Status status, int pageNo, int pageSize) {
		if (status == null) {
			return this.dao.listAllBySubject(subject, pageNo, pageSize);
		} else {
			return this.dao.listAllBySubjectStatus(subject, status, pageNo, pageSize);
		}
	}

	/**
	 * 
	 * @param status
	 * @param pageNo
	 * @param pageSize
	 * @return
	 */
	public Pagination listAll(TutorInfo.Status status, int pageNo, int pageSize) {
		if (status == null) {
			return this.dao.listAll(pageNo, pageSize);
		} else {
			return this.dao.listAllByStatus(status, pageNo, pageSize);
		}
	}

	public int endRegister(List<Long> tutorInfoIds) {
		return changeStatus(tutorInfoIds, TutorInfo.Status.END);
	}

	/**
	 * 管理员删除所有的信息
	 * @param tutorInfoIds
	 * @return
	 */
	public int delTutorInfo(List<Long> tutorInfoIds) {
		return changeStatus(tutorInfoIds, TutorInfo.Status.DELETED);
	}
	
	/**
	 * 用户删除自己发布的信息
	 * @param tutorInfoIds
	 * @param userId
	 * @return
	 */
	public int delMine(List<Long> tutorInfoIds, Long userId) {
		return this.dao.updateStatus(tutorInfoIds, TutorInfo.Status.DELETED, userId);
	}

	private int changeStatus(List<Long> tutorInfoIds, TutorInfo.Status status) {
		if (tutorInfoIds != null && tutorInfoIds.size() > 0) {
			int result = this.dao.updateStatus(tutorInfoIds, status);
			if (result == -1) {
				return -2;// 更新数据库出错
			} else {
				return result;
			}
		} else {
			return -1;// 没有提供编号
		}
	}
}
